﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace DreamShield.Deployment.Miles.CustomPage.StandardPages
{
    /// <summary>
    /// Page personnalisée munie d'un champ de texte devant recevoir
    /// une clef de l'utilisateur. Il est nécessaire de passer une interface
    /// au constructeur qui devra vérifier la validité du code entré.
    /// La gestion du code entré n'est pas géré par cette page.
    /// 
    /// La page sera affichée avant la page de sélection du mode d'installation
    /// </summary>
    public partial class PageVerifySerialNumber : UserControl
    {
        /// <summary>
        /// Interface devant gérer le code entré par l'utilisateur
        /// </summary>
        public interface IPageVerifySerialNumber_Validator
        {
            /// <summary>
            /// Appelé par la page personnalisée afin de valider le code entré
            /// </summary>
            /// <param name="serial">code entré dans le champ de texte</param>
            /// <returns>true si l'installation peut continuer, false s'il faut afficher un message d'erreur à l'utilisateur
            /// indiquant que son code n'est pas valide</returns>
            bool CanContinueWithSerial(string serial);

            /// <summary>
            /// Appelé lorsque le code a été validé et que l'installation continue. La page
            /// de sélection du code ne sera plus affichée après
            /// </summary>
            /// <param name="serial">code entré dans le champ de texte</param>
            void SerialAccepted(string serial);
        }

        /// <summary>
        /// Plugin interne généré pour l'interraction avec l'installeur
        /// </summary>
        public virtual CustomPagePlugin Plugin { get; protected set; }

        /// <summary>
        /// Variables globales de l'installation
        /// </summary>
        public virtual Dictionary<string, object> GlobalInstallerVariables
        {
            get { return Plugin.GlobalInstallerVariables; }
        }

        /// <summary>
        /// Id de la page générée
        /// </summary>
        public virtual string GeneratedPageId
        {
            get { return "PageVerifySerialNumber"; }
        }

        /// <summary>
        /// Indique si la page de vérification du code a déjà été validée
        /// </summary>
        public virtual bool SerialValidated { get; protected set; }

        /// <summary>
        /// Interface de validation du code
        /// </summary>
        public virtual IPageVerifySerialNumber_Validator Validator { get; protected set; }

        /// <summary>
        /// Crée une nouvelle page de vérification d'un code à l'installation
        /// </summary>
        /// <param name="server">Serveur de plugin Miles actuel</param>
        /// <param name="serial_validator">Interface fournissant le service de vérification du code entré par l'utilisateur</param>
        public PageVerifySerialNumber(MilesRootServer server, IPageVerifySerialNumber_Validator serial_validator)
        {
            if (server == null)
                throw new ArgumentNullException("server");
            if (serial_validator == null)
                throw new ArgumentNullException("server_validator");

            SerialValidated = false;
            Validator = serial_validator;

            InitializeComponent();

            /* création du plugin de page personnalisé */
            Plugin = new CustomPagePlugin(server,
                WizardPagesID.InstallationModePage,
                false,
                GeneratedPageId,
                this);

            Plugin.OnNextRequest += new CancelEventHandler(Plugin_OnNextRequest);

            /* différentes options de la page */
            Plugin.ShowForCustom = false;
            Plugin.ShowForInstall = true;
            Plugin.ShowForUninstall = false;
            Plugin.ShowForUpdate = false;
            Plugin.CanShow = true;
            Plugin.CanGoNext = true;
            Plugin.CanGoBack = true;
            Plugin.CanCancel = true;

            InvalidSerialMessage = "Le code produit entré n'est pas valide";
        }

        /// <summary>
        /// Code actuelement rentré par l'utilisateur dans la page
        /// </summary>
        public virtual string UserSerial
        {
            get { return tx_userSerial.Text; }
            set { tx_userSerial.Text = value; }
        }

        /// <summary>
        /// Message affiché lorsque le code n'est pas valide
        /// </summary>
        public virtual string InvalidSerialMessage { get; set; }

        /// <summary>
        /// Validation du code entré par l'utilisateur
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected virtual void Plugin_OnNextRequest(object sender, CancelEventArgs e)
        {
            if (!SerialValidated)
            {
                if (Validator.CanContinueWithSerial(tx_userSerial.Text))
                {
                    SerialValidated = true;
                    Plugin.CanShow = false; /* la page n'est plus affichée après que le serial ai été validé */

                    Validator.SerialAccepted(tx_userSerial.Text);
                }
                else
                {
                    e.Cancel = true;

                    InfoBox.InformationBox.Show(InvalidSerialMessage, "Erreur",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}
